草庐IT

Java HotSpot 枚举开销

全部标签

java - 如何将方法参数声明为任何枚举

我有一个方法,我需要将枚举作为参数传递。publicTdoSomething(SomeEnumoperation,Classsomething);我有几个枚举,该方法是一种常见的方法,应该适用于任何枚举。编写此方法签名以接受任何通用枚举类型的正确方法是什么?我知道我可以为此目的使用标记接口(interface),但我想用通用枚举签名来编写它。请就此给我建议。下面这个有什么坏主意:(它有效,但我从IDE收到警告说它是原始类型。我不清楚原因)。publicvoiddoSomething(Enumoperation); 最佳答案 publ

Java 枚举与静态常量

我正在查看一些由公司其他部门维护的Java代码,顺便提一下,一些前C和C++开发人员。普遍存在的一件事是使用静态整数常量,例如classEngine{privatestaticintENGINE_IDLE=0;privatestaticintENGINE_COLLECTING=1;...}除了缺少“final”限定符之外,我对这种代码有点困扰。我希望看到,在学校主要接受Java培训,会更像classEngine{privateenumState{Idle,Collecting};...}但是,我的论点失败了。为什么,如果有的话,后者比前者更好? 最佳答案

Java 枚举与静态常量

我正在查看一些由公司其他部门维护的Java代码,顺便提一下,一些前C和C++开发人员。普遍存在的一件事是使用静态整数常量,例如classEngine{privatestaticintENGINE_IDLE=0;privatestaticintENGINE_COLLECTING=1;...}除了缺少“final”限定符之外,我对这种代码有点困扰。我希望看到,在学校主要接受Java培训,会更像classEngine{privateenumState{Idle,Collecting};...}但是,我的论点失败了。为什么,如果有的话,后者比前者更好? 最佳答案

java - 为什么不能在 switch 语句中完全限定枚举值?

(注意:已编辑问题;之前的意图不明确)考虑这段代码:publicfinalclassFoo{privateenumX{VALUE1,VALUE2}publicstaticvoidmain(finalString...args){finalXx=X.VALUE1;switch(x){caseVALUE1:System.out.println(1);break;caseVALUE2:System.out.println(2);}}}这段代码运行良好。但是,如果我替换:caseVALUE1://orVALUE2与:caseX.VALUE1://orX.VALUE2然后编译器提示:java:/

java - 为什么不能在 switch 语句中完全限定枚举值?

(注意:已编辑问题;之前的意图不明确)考虑这段代码:publicfinalclassFoo{privateenumX{VALUE1,VALUE2}publicstaticvoidmain(finalString...args){finalXx=X.VALUE1;switch(x){caseVALUE1:System.out.println(1);break;caseVALUE2:System.out.println(2);}}}这段代码运行良好。但是,如果我替换:caseVALUE1://orVALUE2与:caseX.VALUE1://orX.VALUE2然后编译器提示:java:/

java - 枚举、接口(interface)和 (Java 8) lambdas : code compiles but fails at runtime; is this expected?

JDK是Oracle的JDK1.8u65,但“低至”1.8u25也出现了问题。这是完整的SSCCE:publicfinalclassFoo{privateinterfaceX{defaultvoidx(){}}privateenumE1implementsX{INSTANCE,;}privateenumE2implementsX{INSTANCE,;}publicstaticvoidmain(finalString...args){Stream.of(E1.INSTANCE,E2.INSTANCE).forEach(X::x);}}此代码编译;但它在运行时失败:Exceptionint

java - 枚举、接口(interface)和 (Java 8) lambdas : code compiles but fails at runtime; is this expected?

JDK是Oracle的JDK1.8u65,但“低至”1.8u25也出现了问题。这是完整的SSCCE:publicfinalclassFoo{privateinterfaceX{defaultvoidx(){}}privateenumE1implementsX{INSTANCE,;}privateenumE2implementsX{INSTANCE,;}publicstaticvoidmain(finalString...args){Stream.of(E1.INSTANCE,E2.INSTANCE).forEach(X::x);}}此代码编译;但它在运行时失败:Exceptionint

java - 从内部嵌套枚举访问外部类

有办法进入外面吗?publicclassOuterClass{Stringdata;publicvoidouterMethod(Stringdata){this.data=data;}publicenumInnerEnum{OPTION1("someData"),OPTION2("otherData");InnerEnum(Stringdata){//Doesnotwork:OuterClass.this.outerMethod(data);}}} 最佳答案 正如Eric所说,枚举是隐式静态的。做你想做的事,添加一个方法,callO

java - 从内部嵌套枚举访问外部类

有办法进入外面吗?publicclassOuterClass{Stringdata;publicvoidouterMethod(Stringdata){this.data=data;}publicenumInnerEnum{OPTION1("someData"),OPTION2("otherData");InnerEnum(Stringdata){//Doesnotwork:OuterClass.this.outerMethod(data);}}} 最佳答案 正如Eric所说,枚举是隐式静态的。做你想做的事,添加一个方法,callO

java - Proguard 不会保留类(class)成员的枚举

我正在开发一个作为javajar分发的库,并且我正在对它运行proguard,以便只暴露所需的接口(interface)。我有一个带有一堆成员变量和一些枚举定义的配置类。我的proguard脚本很好地保留了成员变量,但是,枚举定义被混淆了。我已经尝试了所有我能想到的强制proguard保留这些内部定义和公共(public)枚举的方法,但我无法让它工作。我现在正在使用:-keeppublicclasscom.stuff.MyConfigObject{public*;}-keepclassmembersenum*{publicstatic**[]values();publicstatic*